<?php
use think\Db;
if (!function_exists('ts_key')) {
    /**
     * 将数据库中查询出来的数据转换为 $key=>$val 格式
     * @author 赵鹏飞 <760744117@qq.com>
     * @return mixed
     */
    function ts_key($data=[],$key='id',$val='name')
    {
		if(!is_array($data)||empty($data)) return $data;
		$result = [];
		for($i = 0;$i<sizeof($data);$i++){
			$temp = $data[$i];
			$result[$temp[$key]] = $temp[$val];
		}
        return $result;
    }
}

// 获取价格，显示使用，分->元
if(!function_exists('getPrice'))
{
    function getPrice($price)
    {
        return sprintf('%.2f', $price/100);
    }
}

// 设置价格，元->分
if(!function_exists('setPrice'))
{
    function setPrice($price)
    {
        return $price*100;
    }
}

if(!function_exists('getArea')){
    function getArea($province_id="",$city_id="",$area_id=""){
        if(empty($province_id)) return null;
        $Address=Db::name("admin_area")->where('id','in',$province_id.','.$city_id.','.$area_id)->column("name");
        return implode(",",$Address);
    }
}

if (!function_exists('IdsToStr')) {
    /**
     * 将数组转换为字符串以,分开
     * @author 赵鹏飞 <760744117@qq.com>
     * @return mixed
     */
    function IdsToStr($data=[])
    {
		if(!is_array($data)||empty($data)) return $data;
		$result = '';
		for($i = 0;$i<sizeof($data);$i++){
			$result  .= $data[$i].',';
		}
		$result = substr($substr,0,-1);
        return $result;
    }
}
if (!function_exists('authcode')) {
    /**
     * 简单对称加密算法之解密
     * @param String $string  明文 或 密文
     * @param String $operation DECODE表示解密,其它表示加密
     * @param String $key   密匙
     * @param String $expiry 密文有效期
     * @return String
     */
    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
        // 动态密匙长度，相同的明文会生成不同密文就是依靠动态密匙
        $ckey_length = 4;
        // 密匙
        $key = md5($key ? $key : config('AUTH_KEY'));
        // 密匙a会参与加解密
        $keya = md5(substr($key, 0, 16));
        // 密匙b会用来做数据完整性验证
        $keyb = md5(substr($key, 16, 16));
        // 密匙c用于变化生成的密文
        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
        // 参与运算的密匙
        $cryptkey = $keya . md5($keya . $keyc);
        $key_length = strlen($cryptkey);
        // 明文，前10位用来保存时间戳，解密时验证数据有效性，10到26位用来保存$keyb(密匙b)，解密时会通过这个密匙验证数据完整性
        // 如果是解码的话，会从第$ckey_length位开始，因为密文前$ckey_length位保存 动态密匙，以保证解密正确
        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
        $string_length = strlen($string);
        $result = '';
        $box = range(0, 255);
        $rndkey = array();
        // 产生密匙簿
        for ($i = 0; $i <= 255; $i++) {
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);
        }
        // 用固定的算法，打乱密匙簿，增加随机性，好像很复杂，实际上对并不会增加密文的强度
        for ($j = $i = 0; $i < 256; $i++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        // 核心加解密部分
        for ($a = $j = $i = 0; $i < $string_length; $i++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            // 从密匙簿得出密匙进行异或，再转成字符
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if ($operation == 'DECODE') {
            // substr($result, 0, 10) == 0 验证数据有效性
            // substr($result, 0, 10) - time() > 0 验证数据有效性
            // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
            // 验证数据有效性，请看未加密明文的格式
            if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
                return substr($result, 26);
            } else {
                return '';
            }
        } else {
            // 把动态密匙保存在密文里，这也是为什么同样的明文，生产不同密文后能解密的原因
            // 因为加密后的密文可能是一些特殊字符，复制过程可能会丢失，所以用base64编码
            return $keyc . str_replace('=', '', base64_encode($result));
        }
    }
}
if (!function_exists('edauth')) {
    /**
     * edauth高效可逆随机加密函数
     * @param string $string    明文 或 密文
     * @param bool $operation：true表示加密,false表示解密
     * @param string $key： 密匙
     * @param int $outtime：密文有效期, 单位为秒
     * @param string $entype：加密方式 有md5和sha1两种 加密解密需要统一使用同一种方式才能正确还原明文
     * @return string
     */
    function edauth($string, $operation = true, $outtime = 0, $entype = 'md5',$key = "") {
        $key = md5($key ? $key : C('AUTH_KEY'));
        $key_length = 4;
        if ($entype == 'md5') { //使用md5方式
            $long_len = 32;
            $half_len = 16;
            $entype == 'md5';
        } else { //使用sha1方式
            $long_len = 40;
            $half_len = 20;
            $entype == 'sha1';
        }
        $key = $key != '' ? $key : substr(md5($_SERVER['DOCUMENT_ROOT'] . C('AUTH_KEY') . $_SERVER['REMOTE_ADDR']), 0, 30);
        $fixedKey = hash($entype, $key);
        $egiskeys = md5(substr($fixedKey, $half_len, $half_len));
        $runtoKey = $key_length ? ($operation ? substr(hash($entype, microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
        $keys = hash($entype, substr($runtoKey, 0, $half_len) . substr($fixedKey, 0, $half_len) . substr($runtoKey, $half_len) . substr($fixedKey, $half_len));
        $string = $operation ? sprintf('%010d', $outtime ? $outtime + time() : 0) . substr(md5($string . $egiskeys), 0, $half_len) . $string : base64_decode(substr($string, $key_length));
        $i = 0;
        $result = '';
        $string_length = strlen($string);
        for ($i = 0; $i < $string_length; $i++) {
            $result .= chr(ord($string{$i}) ^ ord($keys{$i % $long_len}));
        }
        if ($operation) {
            return $runtoKey . str_replace('=', '', base64_encode($result));
        } else {
            if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, $half_len) == substr(md5(substr($result, $half_len + 10) . $egiskeys), 0, $half_len)) {
                return substr($result, $half_len + 10);
            } else {
                return '';
            }
        }
    }
}
if (!function_exists('genRandomString')) {
    /**
     * 产生随机字符串
     * 产生一个指定长度的随机字符串,并返回给用户
     * @access public
     * @param int $len 产生字符串的位数
     * @return string
     */
    function genRandomString($len = 6) {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );
        $charsLen = count($chars) - 1;
        shuffle($chars);    // 将数组打乱
        $output = "";
        for ($i = 0; $i < $len; $i++) {
            $output .= $chars[mt_rand(0, $charsLen)];
        }
        return $output;
    }
}
if (!function_exists('genNumberString')) {
    /**
     * 产生随机字符串
     * 产生一个指定长度的随机字符串,并返回给用户
     * @access public
     * @param int $len 产生字符串的位数
     * @return string
     */
    function genNumberString($len = 7) {
        $chars = array(
            "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
        );
        $charsLen = count($chars) - 1;
        shuffle($chars);    // 将数组打乱
        $output = "";
        for ($i = 0; $i < $len; $i++) {
            $output .= $chars[mt_rand(0, $charsLen)];
        }
        return $output;
    }
}
if (!function_exists('str_cut')) {
    /**
     * 字符截取
     * @param string $string 需要截取的字符串
     * @param int $length 长度
     * @param string $dot
     */
    function str_cut($sourcestr, $length, $dot = '...') {
        $returnstr = '';
        $i = 0;
        $n = 0;
        $str_length = strlen($sourcestr); //字符串的字节数
        while (($n < $length) && ($i <= $str_length)) {
            $temp_str = substr($sourcestr, $i, 1);
            $ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
            if ($ascnum >= 224) {//如果ASCII位高与224，
                $returnstr = $returnstr . substr($sourcestr, $i, 3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
                $i = $i + 3; //实际Byte计为3
                $n++; //字串长度计1
            } elseif ($ascnum >= 192) { //如果ASCII位高与192，
                $returnstr = $returnstr . substr($sourcestr, $i, 2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
                $i = $i + 2; //实际Byte计为2
                $n++; //字串长度计1
            } elseif ($ascnum >= 65 && $ascnum <= 90) { //如果是大写字母，
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1; //实际的Byte数仍计1个
                $n++; //但考虑整体美观，大写字母计成一个高位字符
            } else {//其他情况下，包括小写字母和半角标点符号，
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1;            //实际的Byte数计1个
                $n = $n + 0.5;        //小写字母和半角标点等与半个高位字符宽...
            }
        }
        if ($str_length > strlen($returnstr)) {
            $returnstr = $returnstr . $dot; //超过长度时在尾处加上省略号
        }
        return $returnstr;
    }
}
if (!function_exists('substrreplace')) {
    /**
    * 隐藏隐私信息
    * @access public 
    * @param string $str 用户ID
    * @return string
    */
    function substrreplace($str) {
        $len = strlen($str) / 2;
        return substr_replace($str, str_repeat('*', $len), ceil(($len) / 2), $len);
    }
}
if (!function_exists('kilobit')) {
    /**
    * 数值千位分隔符
    * @access public 
    * @param float $num
    * @return string
    */
    function kilobit($num) {
        if(empty($num)){
            return 0.00;
        }else{
            $num = preg_replace('/(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))/', ',', $num);
            return $num;
        }
        
    }
}

if (!function_exists('getverify')) {
    function getverify($receiver,$receivertype=0){
        $verifyset=Db::name('verify')->where(array('receiver'=>$receiver,'type'=>$receivertype))->find();
        $time=time()-$verifyset['expiretime'];
        if($time>0){
            $verify="";
            Db::name('verify')->where(array('receiver'=>$receiver,'type'=>$receivertype))->update(array( 
            'status'=>1
            ));
        }else{
            $verify=$verifyset['verify'];
            Db::name('verify')->where(array('receiver'=>$receiver,'type'=>$receivertype))->update(array(
            'status'=>1
            ));
        }
        return $verify;
    }
}

if (!function_exists('check_phone')) {
    /**
    * 检测手机号码是否已被使用
    * @param string $phone 需要检测手机号码
    * @return bool
    * @author yiyouguisu<741459065@qq.com> time|20151219
    */
    function check_phone($phone) {
        $where['mobile']=$phone;
        $result = Db::name("Member")->where($where)->select();
        if($result){
            return false;
        }else{
            return true;
        }
    }
}

if (!function_exists('isMobile')) {
    /**
    * 检测手机号码格式是否正确
    * @param string $phone 需要检测手机号码
    * @return bool
    * @author yiyouguisu<741459065@qq.com> 20151219
    */
    function isMobile($num) {
        return preg_match('#^13[\d]{9}$|14^[0-9]\d{8}|^15[0-9]\d{8}$|^18[0-9]\d{8}$#', $num) ? true : false;
    }
}

if (!function_exists('check_email')) {
    /**
    * 检测邮箱号码是否已被使用
    * @param string $email 需要检测邮箱号码
    * @return bool
    * @author yiyouguisu<741459065@qq.com> time|20151219
    */
    function check_email($email) {
        $where['email']=$email;
        $result = Db::name("Member")->where($where)->select();
        if($result){
            return false;
        }else{
            return true;
        }
    }
}
if (!function_exists('check_username')) {
    /**
    * 检测用户名是否已被使用
    * @param string $username 需要检测的用户名
    * @return bool
    * @author yiyouguisu<741459065@qq.com> time|20151219
    */
    function check_username($username) {
        $result = Db::name("Member")->where("user_name='".$username."'")->find();
        if($result){
            return true;
        }else{
            return false;
        }
    }
}
if (!function_exists('check_idcard')) {
    /**
    * 检测身份证号码是否已被使用
    * @param string $idcard 需要检测的身份证号码
    * @return bool
    * @author yiyouguisu<741459065@qq.com> time|20151219
    */
    function check_idcard($idcard) {
        $result = Db::name("Member")->where("idcard='" . $idcard."'")->find();
        if($result){
            return false;
        }else{
            return true;
        }
    }
}
if (!function_exists('funccard')) {
    /**
    * 检测身份证号码格式是否正确
    * @param string $idcard 需要检测的身份证号码
    * @return bool
    * @author yiyouguisu<741459065@qq.com> time|20151219
    */
    function funccard($str){
        return (preg_match('/\d{17}[\d|x]|\d{15}/',$str))?true:false;
    }
}
if(!function_exists('getPath')){
    /**
     *获取文件路径
     */
    function getPath($id = 0){
        $path = db('admin_attachment')->where('id',$id)->value('path');
        return $path;
    }
}